import grails.util.GrailsUtil
import br.com.qualityempresa.seguranca.Acesso
import br.com.qualityempresa.seguranca.PasswordCodec
import br.com.qualityempresa.seguranca.Perfil
import br.com.qualityempresa.seguranca.RegraAcesso
import br.com.qualityempresa.seguranca.Usuario

class BootStrap {

	def grailsApplication

	def init = { servletContext ->
		switch(GrailsUtil.environment){
			case 'development':
				loadDBDev()
				break

			case 'production':
				loadDBProd()
				break
		}
	}

	def destroy = {
	}

	private loadDBProd() {
		loadSystemUsersProd()
		loadDB()
	}
	
	private loadDBDev() {
		loadSystemUsersDev()
		loadDB()
	}

	private loadDB() {
		loadSystemCombosBoxes()
		loadSystemParams()
	}


//	Usuários para ambiente produção
	private loadSystemUsersProd() {
		def Perfil perfilAdministradorSistema = criarPerfilAdministradorSistema()
		new Usuario(
				perfil: perfilAdministradorSistema, nome:'Admin', email:'admin@dolphinsystems.com.br',
				senha:'admin!@#$', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true,
				).save()

		def Perfil perfilAnonimo = criarPerfilAnonimo()

		def Perfil perfilAdministrador = criarPerfilAdministrador()
		new Usuario(
				perfil: perfilAdministrador, nome:'Mirian', email:'mio.liv@hotmail.com',
				senha:'mirian1!', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true
				).save()
		
		def Perfil perfilColaborador = criarPerfilColaborador()
		new Usuario(
				perfil: perfilColaborador, nome:'Fabiano', email:'fabiano.nezello@facear.edu.br',
				senha:'teste', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true
				).save()
	}
	
	private loadSystemUsersDev() {
		def Perfil perfilAdministradorSistema = criarPerfilAdministradorSistema()
		new Usuario(
				perfil: perfilAdministradorSistema, nome:'Admin', email:'admin@dolphin.com.br',
				senha:'admin!@#$', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true,
				).save()

		def Perfil perfilAnonimo = criarPerfilAnonimo()

		def Perfil perfilAdministrador = criarPerfilAdministrador()
		new Usuario(
				perfil: perfilAdministrador, nome:'Mirian', email:'mio.liv@hotmail.com',
				senha:'admin!@#$', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true
				).save()
		
		def Perfil perfilColaborador = criarPerfilColaborador()
		new Usuario(
				perfil: perfilColaborador, nome:'Ivan', email:'ivanerison@gmail.com',
				senha:'admin!@#$', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true
				).save()
				
		def Perfil perfilNovo = criarPerfilNovo()
		new Usuario(
				perfil: perfilNovo, nome:'Novo', email:'novo@union.com.br',
				senha:'admin!@#$', hashSenha: PasswordCodec.hashEncode('admin1!'), ativo: true,
				).save()
	}
	

	private loadSystemParams() {
		/// Carregar Parametros
	}

	private criarPerfilAdministradorSistema() {
		def Perfil perfil = Perfil.get(Perfil.PERFIL_ADMINISTRADOR_SISTEMA_ID)
		if (!perfil) {
			perfil = new Perfil(nome: 'Administrador do Sistema', descricao: 'Perfil que possui todo acesso ao sistema, sem restricoes', visivel: false)
			perfil.save()
		}
		def acesso 
		
		acesso = Acesso.findOrCreateWhere(controle: '*', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		perfil.save()
		return perfil
	}

	private criarPerfilAnonimo() {
		def Perfil perfil = Perfil.get(Perfil.PERFIL_ANONIMO_ID)
		if (!perfil) {
			perfil = new Perfil(nome: 'Anonimo', descricao: 'Perfil de usuarios que nao foram autenticados no sistema', visivel: false)
			perfil.save()
		}
		def acesso 
		
		acesso = Acesso.findOrCreateWhere(controle: 'painel', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		perfil.save()
		return perfil
	}

	private criarPerfilAdministrador() {
		def Perfil perfil = Perfil.get(Perfil.PERFIL_ADMINISTRADOR_ID)
		if (!perfil) {
			perfil = new Perfil(nome: 'Administrador', descricao: 'Perfil de usuarios que possui acesso administrativo em todo o sistema', visivel: true)
			perfil.save()
		}
		def acesso
		
		acesso = Acesso.findOrCreateWhere(controle: '*', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		acesso = Acesso.findOrCreateWhere(controle: 'perfil', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso))

		acesso = Acesso.findOrCreateWhere(controle: 'acesso', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso))

		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'listarPerfisInvisiveis')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso))

		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'alterarPerfil')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))
		
		perfil.save()
		return perfil
	}

	private criarPerfilColaborador() {
		def Perfil perfil = Perfil.get(Perfil.PERFIL_COLABORADOR_ID)				
		def acesso
		if (!perfil) {
			perfil = new Perfil(nome: 'Colaborador', descricao: 'Perfil de colaborador', visivel: true)
			perfil.save()
		}
			
		
		acesso = Acesso.findOrCreateWhere(controle: '*', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		acesso = Acesso.findOrCreateWhere(controle: 'perfil', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso)) //false

		acesso = Acesso.findOrCreateWhere(controle: 'acesso', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso)) //false

		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'listarPerfisInvisiveis')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso)) //false

		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'alterarPerfil')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))
		
		
		
		// Especificos para colaborador
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'perfil')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'list')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'edit')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'save')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'show')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'update')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'create')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		acesso = Acesso.findOrCreateWhere(controle: 'usuario', acao: 'alterarPerfil')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: false, acesso: acesso)) 
		
		
		perfil.save()
		return perfil
		
	}

	private criarPerfilNovo() {
		def Perfil perfil = Perfil.get(Perfil.PERFIL_NOVO_ID)
		if (!perfil) {
			perfil = new Perfil(nome: 'Novo no Sistema', descricao: 'Perfil que possui todo acesso ao sistema, sem restricoes', visivel: false)
			perfil.save()
		}
		def acesso
		
		acesso = Acesso.findOrCreateWhere(controle: '*', acao: '*')
		acesso.save()
		perfil.addToRegrasAcesso(new RegraAcesso(permitir: true, acesso: acesso))

		perfil.save()
		return perfil
	}

	
	private loadSystemCombosBoxes() {
		
	}
}
